home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / BLOCK / Block.cpp next >
C/C++ Source or Header  |  2000-02-06  |  6KB  |  301 lines

  1. /********************************************************************************/
  2. /*                                                                              */
  3. /*  "THE BLOCK BUSTER"                                                          */
  4. /*                                                                              */
  5. /********************************************************************************/
  6.  
  7. // 以下のコメントをはずすと,”Borland C++ Builder3”でコンパイルが可能になる
  8. //#define BCB WinMain
  9.  
  10. #include "el.h"
  11.  
  12. // 画面定義
  13. #define MAIN_SCREEN 1    // メイン画面
  14. #define OVER_SCREEN 2    // ゲームオーバ画面
  15.  
  16. // 画面用関数のプロトタイプ宣言
  17. void MainScreen(void);
  18. void OverScreen(void);
  19.  
  20. // 関数のプロトタイプ宣言
  21. void InitFunc(void);    // 初期化
  22.  
  23. // グラフィックオブジェクト
  24. DDOBJ PadBMP;        // パドル 
  25. DDOBJ BallBMP;        // ボール
  26. DDOBJ BlockBMP;        // ブロック
  27. DDOBJ CanvasBMP;    // 背景 
  28.  
  29. // サウンドオブジェクト
  30. DSOBJ HitWAV;    // 命中
  31. DSOBJ MissWAV;    // ミス
  32.  
  33. // ボール
  34. struct ball{
  35.     bool Vw;         // 描画                    
  36.     float X,Y;         // 座標
  37.     float XAdd,YAdd; // 移動量
  38.     float AddSpeed;     // 速度
  39. }Ball;
  40.  
  41. int Score;         // スコア
  42. int HiScore=300; // ハイスコア    
  43. int BlockCnt;     // ブロックカウンター
  44.  
  45. const int PAD_Y=400;    // パドルのY座標
  46. const int MAX_X=9;        // ブロック数最大値(横)
  47. const int MAX_Y=6;        //        "     (縦)
  48. const int BLOCK_X=104;    // ブロック描画の先頭座標(横)
  49. const int BLOCK_Y=100;    //        "        (縦)
  50.  
  51. // 汎用
  52. int x,y;
  53.  
  54. // ブロック
  55. int Block[MAX_X][MAX_Y];
  56.  
  57. // 反発力テーブル
  58. float PadDir[16][2]={
  59.         -257.082106f,-138.905142f,        // 左
  60.         -257.082106f,-147.085399f,        
  61.         -264.576387f,-141.419023f,    
  62.         -231.903130f,-190.317982f,
  63.         -190.317982f,-231.903130f,
  64.         -141.419023f,-264.576387f,
  65.         -87.0853995f,-287.082106f,
  66.         -29.405142f,-298.555416f,        //
  67.          29.405142f,-298.555416f,        // 中央
  68.          87.0853995f,-287.082106f,
  69.          141.4190235f,-264.576387f,
  70.          190.3179825f,-231.903130f,
  71.          231.9031305f,-190.317982f,
  72.          264.5763873f,-141.419023f,
  73.          257.0821063f,-147.085399f,
  74.          257.0821064f,-138.905142f        // 右
  75. };
  76.  
  77. // メイン関数
  78.  
  79. int elMain("THE BLOCK BUSTER")
  80. {
  81.  
  82. //    elWindow(640,480,FALSE);
  83. //    elSetWindow(RUN_NOTOP|RUN_INACTIVE);
  84.  
  85.     elLoop()
  86.     {
  87.         elSetScreen(MAIN_SCREEN,MainScreen());
  88.         elSetScreen(OVER_SCREEN,OverScreen());
  89.     }
  90.  
  91.     elExitMain();
  92. }
  93.  
  94. // ウィンドウ生成関数
  95.  
  96. void elCreate(void)
  97. {
  98.     elDraw::Screen(640,480);
  99.  
  100.     // ビットマップファイルの読み込み
  101.     BallBMP=elDraw::LoadObject("BMP\\BALL.BMP");
  102.     PadBMP=elDraw::LoadObject("BMP\\PAD.BMP");
  103.     BlockBMP=elDraw::LoadObject("BMP\\BLOCK.BMP");
  104.     CanvasBMP=elDraw::LoadObject("BMP\\CANVAS.BMP");
  105.     
  106.     // サウンドファイル(WAVE)の読みこみ
  107.     HitWAV=elSound::LoadObject("SOUND\\HIT.WAV");
  108.     MissWAV=elSound::LoadObject("SOUND\\MISS.WAV");
  109.     
  110.     elCallScreen(MAIN_SCREEN);
  111. }
  112.  
  113. // キーボード関数
  114.  
  115. void elKeyboard(void)
  116. {
  117.     case VK_ESCAPE:
  118.     elDraw::Exit();
  119.     break;
  120.     elExitKeyboard();
  121. }
  122.  
  123. // イベント関数
  124.  
  125. long elEvent(void)
  126. {
  127.     elExitEvent();
  128. }
  129.  
  130. // メイン画面
  131.  
  132. void MainScreen(void)
  133. {
  134.     // 画面が切り替わった直後の場合
  135.     if (elChangeScreen())
  136.     {
  137.         // 初期化処理関数の呼び出し
  138.         Score=0;
  139.         InitFunc();
  140.     }    
  141.  
  142.     elDraw::Clear();
  143.     
  144.     // ゲーム画面の描画
  145.     elDraw::DirectLayer(0,0,CanvasBMP,0,0,640,480);
  146.  
  147.     // 右マウスクリックでゲームスタート
  148.     if (MouseCL)
  149.         Ball.Vw=TRUE;
  150.     
  151.     if (!Ball.Vw && Blink)
  152.         SHOW2(240,260,"Please Click Your Mouse...");
  153.  
  154.     // ブロックの描画
  155.     for (x=0;x<MAX_X;x++){
  156.         for (y=0;y<MAX_Y;y++){
  157.             if (!Block[x][y])
  158.                 continue;
  159.             elDraw::Layer((x*48)+BLOCK_X,(y*16)+BLOCK_Y,BlockBMP,0,0,48,16);
  160.         }
  161.     }
  162.  
  163.     // ボールの移動処理&描画
  164.     if (Ball.Vw){
  165.         Ball.X+=FrameTime*Ball.XAdd;
  166.         Ball.Y+=FrameTime*Ball.YAdd;    
  167.         elDraw::Layer((int)Ball.X,(int)Ball.Y,BallBMP,0,0,16,16);
  168.     }
  169.     
  170.     // パドルの移動範囲をチェック
  171.     if (MousePX<100)
  172.         MousePX=100;
  173.     if (MousePX>640-64-100)
  174.         MousePX=640-64-100;
  175.  
  176.     // パドルの描画
  177.     elDraw::Layer(MousePX,PAD_Y,PadBMP,0,0,64,24);    
  178.     
  179.     // スコア表示
  180.     SHOW2(0,0,"Score %5d Hi-Score %5d",Score,HiScore);
  181.     
  182.     elDraw::Refresh();
  183.     
  184.     // パドルとボールの当り判定
  185.     if ((int)Ball.Y+16>PAD_Y && (int)Ball.Y+16<PAD_Y+24){
  186.         if ((int)Ball.X>MousePX-16 && (int)Ball.X<MousePX+64){
  187.     
  188.             // パドルのどこにボールが当たったのか?
  189.             x=((int)(Ball.X+8-MousePX)>>2);
  190.             if (x<0) x=0;
  191.             if (x>15) x=15;
  192.             // 反発力テーブルを参照して,ボールの移動量を決定
  193.             Ball.XAdd=PadDir[x][0]*Ball.AddSpeed;
  194.             Ball.YAdd=PadDir[x][1]*Ball.AddSpeed;
  195.             if (Ball.YAdd>=16) Ball.YAdd=16;
  196.                 
  197.         }
  198.     }
  199.     
  200.     // ブロックとの当たり判定
  201.     for (y=0;y<MAX_Y;y++){
  202.         if ((int)Ball.Y<(y*16)+BLOCK_Y-16 ||
  203.             (int)Ball.Y>=(y*16)+BLOCK_Y+16)
  204.             continue;
  205.         
  206.         for (x=0;x<MAX_X;x++){
  207.             if ((int)Ball.X+16<(x*48)+BLOCK_X ||
  208.                 (int)Ball.X>=(x*48)+48+BLOCK_X)
  209.                 continue;
  210.     
  211.             // ブロックは生きているか?
  212.             if (!Block[x][y])
  213.                 continue;
  214.         
  215.             // そのブロックを消す
  216.             Block[x][y]=FALSE;
  217.             
  218.             // ボールの符号の反転
  219.             // Ball.XAdd=-Ball.XAdd;
  220.             Ball.YAdd=-Ball.YAdd;
  221.  
  222.             // ボール加速度の決定
  223.             if(Ball.AddSpeed<F(1.6))
  224.                 Ball.AddSpeed+=F(0.01);
  225.         
  226.             BlockCnt++;
  227.     
  228.             Score+=10;
  229.             if (Score>HiScore) 
  230.                 HiScore=Score;
  231.         
  232.             elSound::Play(HitWAV);    
  233.             y=999;
  234.             break;
  235.         }
  236.     }
  237.  
  238.     // ゲームクリア?
  239.     if (BlockCnt==MAX_X*MAX_Y)
  240.         InitFunc();
  241.     
  242.     // ボールの移動範囲をチェック    
  243.     if (Ball.X<F(100)){
  244.         Ball.X=F(100);
  245.         Ball.XAdd=-Ball.XAdd;
  246.     }
  247.  
  248.     if (Ball.X>F(524)){
  249.         Ball.X=F(524);
  250.         Ball.XAdd=-Ball.XAdd;
  251.     }
  252.  
  253.     if (Ball.Y<F(24)){
  254.         Ball.Y=F(24);
  255.         Ball.YAdd=-Ball.YAdd;
  256.     } 
  257.  
  258.     // ボールが最下段へ落ちたらゲームオーバ
  259.     if (Ball.Y>F(440))    
  260.         elCallScreen(OVER_SCREEN);
  261. }
  262. // ゲームオーバ関数
  263.  
  264. void OverScreen(void)
  265. {
  266.  
  267.     // 画面が切り替わった直後の場合
  268.     if (elChangeScreen())
  269.     {
  270.         elSound::Play(MissWAV);
  271.     }    
  272.     
  273.     SHOW2(294,260,"GAME OVER");
  274.     elDraw::Refresh();
  275.     
  276.     // 再びメイン画面処理関数へ
  277.     
  278.     if (MouseCL)
  279.         elCallScreen(MAIN_SCREEN);
  280. }
  281.  
  282. // ゲーム初期化関数
  283. void InitFunc(void)
  284. {
  285.     // ボール情報の初期化
  286.     Ball.Vw=FALSE;
  287.     Ball.X=F(200);
  288.     Ball.Y=F(250);
  289.     Ball.XAdd=F(100);
  290.     Ball.YAdd=F(100);
  291.     Ball.AddSpeed=F(1);
  292.  
  293.     // ブロック情報の初期化
  294.     BlockCnt=0;
  295.     for(x=0;x<MAX_X;x++){
  296.         for(y=0;y<MAX_Y;y++){
  297.         Block[x][y]=TRUE;
  298.         }
  299.     }
  300. }
  301.